#ifndef NET_TCPSERVER_H
#define NET_TCPSERVER_H

#include <mutex>
#include <memory>
#include <unordered_map>
#include "EventLoop.h"
#include "Acceptor.h"
#include "ThreadPool.h"
#include "Connection.h"
#include "Channel.h"

class TcpServer {
public:
    TcpServer(const std::string &ip, uint16_t port, int threadNum = 3);
    ~TcpServer();
    void Start();
    void Stop();
    void OnConnection(Socket& clientSock);                          // 处理新客户端连接请求，在Acceptor类中回调此函数。
    void CloseConnection(ConnectionPtr conn);                       // 关闭客户端的连接，在Connection类中回调此函数。
    void ErrorConnection(ConnectionPtr conn);                       // 客户端的连接错误，在Connection类中回调此函数。
    void OnMessage(ConnectionPtr conn,std::string& message) const;  // 处理客户端的请求报文，在Connection类中回调此函数。
    void SendComplete(ConnectionPtr conn) const;                    // 数据发送完成后，在Connection类中回调此函数。
    void EpollTimeout(EventLoop *loop) const;                       // epoll_wait()超时，在EventLoop类中回调此函数。
    void RemoveConnection(int fd);                                  // 在EventLoop::handletimer()中将回调此函数。

public:
    std::function<void(ConnectionPtr)> onConnection;
    std::function<void(ConnectionPtr)> onCloseConnection;
    std::function<void(ConnectionPtr)> onErrorConnection;
    std::function<void(ConnectionPtr, std::string &message)> onMessage;
    std::function<void(ConnectionPtr)> onSendComplete;
    std::function<void(EventLoop *)> onTimeout;
    std::function<void(int)> onRemoveConnection;

private:
    std::unique_ptr<EventLoop> mainLoop;
    std::vector<std::unique_ptr<EventLoop>> subLoops;
    Acceptor acceptor;
    ThreadPool threadPool;
    uint32_t threadNum;
    std::mutex mutex;
    std::unordered_map<int, ConnectionPtr> conns;
};


#endif //NET_TCPSERVER_H
